#include <iostream>
#include <cstdio>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

using namespace std;

int main()
{
    pid_t pid = fork();
    if (!pid) // 子进程
    {
        int time = 10;
        for (int i = 1; i <= time; i++)
        {
            printf("I am child process : %d\n", i);
            sleep(1);
        }
        exit(11);
    }

    // 父进程
    while (1)
    {
        int status;
        int ret = waitpid(pid, &status, WNOHANG);  //选项设置为WNOHANG
        if (ret == 0)    //还在等待的情况
        {
            printf("子进程还没有结束运行,我再干点其他事\n");
            sleep(1);
            continue;   //回溯
        }
        else if (ret < 0)  //等待失败的情况
        {
            printf("等待失败");
            exit(1);    //进程退出
        }
        else  //等待成功的情况
        {
            printf("等待成功, %d %d\n", (status >> 8) & 0xFF, status & 0x7F);
            break;
        }
    }
    return 0;
}

// int main()
// {
//     pid_t pid = fork();
//     if (!pid) // 子进程
//     {
//         int time = 10;
//         for (int i = 1; i <= time; i++)
//         {
//             printf("I am child process : %d,pid: %d\n", i,getpid());
//             sleep(1);
//         }
//         return 111;
//     }

//     // 父进程
//     while (1)
//     {
//         int status;
//         int ret = waitpid(pid, &status, WNOHANG);
//         if (ret == 0)
//         {
//             printf("子进程还没有结束运行,我再干点其他事\n");
//             sleep(1);
//             continue;
//         }
//         else if (ret < 0)
//         {
//             printf("等待失败");
//             exit(1);
//         }
//         else
//         {
//             if (WIFEXITED(status))
//             {
//                 printf("等待成功, 退出码为: %d\n", WEXITSTATUS(status));
//             }
//             else
//             {
//                 printf("子进程异常退出, 收到%d号信号\n", WTERMSIG(status));
//             }
//             break;
//         }
//     }
//     return 0;
// }